#ifndef __BOOTLOARDER_H__
#define __BOOTLOARDER_H__

#include "gd32f30x.h"
#include "self_flash_drv.h"

/********************************************************
| 0x08000000 | 0x0800F000 |  0x08010000  |  0x08048000 |
---------------------------------------------------------
|    BOOT    |  SETTING   |      APP     |   DOWNLOAD  |
---------------------------------------------------------
|    60k     |     4K     |      224K     |     224K     |
*********************************************************/
// 操作flash的时候 要求两字节对齐 所以 各部分的起始地址 必须是2的倍数

// -------------------------- Flash 分区配置 --------------------------
#define FLASH_SECTOR_SIZE       (1024 * 2)  // 2KB/扇区（加括号避免运算优先级问题）
#define FLASH_SECTOR_NUM        256         // 总扇区数
#define FLASH_START_ADDR        ((uint32_t)0x08000000)
#define FLASH_END_ADDR          ((uint32_t)(FLASH_START_ADDR + FLASH_SECTOR_NUM * FLASH_SECTOR_SIZE))

#define BOOT_SECTOR_ADDR        0x08000000  // Boot 起始地址（60K：0x08000000~0x0800EFFF）
#define BOOT_SECTOR_SIZE        0xF000      // 60K（0xF000 = 61440 字节）
#define SETTING_SECTOR_ADDR     0x0800F000  // Setting 起始地址（4K：0x0800F000~0x0800FFFF）
#define SETTING_SECTOR_SIZE     0x1000      // 4K
#define APP_SECTOR_ADDR         0x08010000  // APP 起始地址（224K：0x08010000~0x08047FFF）
#define APP_SECTOR_SIZE         0x38000     // 224K（0x38000 = 229376 字节）
#define DOWNLOAD_SECTOR_ADDR    0x08048000  // 下载区起始地址（224K：0x08048000~0x0807FFFF）
#define DOWNLOAD_SECTOR_SIZE    0x38000     // 224K

// -------------------------- RAM 配置 --------------------------
#define RAM_START_ADDRESS       0x20000000  // RAM 起始地址
#define RAM_SIZE                0x10000                 // 64K RAM（0x10000 = 65536 字节）

// -------------------------- Flash 操作宏--------------------------
#define WRITE_DATA_TO_FLASH(addr, data, len)  FlashWrite((addr), (data), (len))
#define READ_DATA_FROM_FLASH(addr, data, len)  FlashRead((addr), (data), (len)) 

// -------------------------- 升级配置 --------------------------
#define UPGRADE_BUFF_SIZE       128  // 128字节缓冲区（224K是128的1792倍，满足整数倍要求）                                                                                                                                                          

typedef enum {
    START_UP_NONE_MODE,      // 无效模式
    START_UP_NORMAL_MODE,    // 正常流程                                                          
    START_UP_UPGRADE_MODE,   // 升级模式
}StartUpMode_e; //启动模式

typedef enum {
    UPGRADE_START,// 开启升级
    UPGRADE_ING, // 升级中
    UPGRADE_ERROR, // 升级出现错误
    UPGRADE_SUCCESS, // 升级成功
}UpgradeProcess_e; //升级过程

typedef void (*jump_callback)(void);

/**
 * @desc  : 读取setting中的启动模式
 * @date  : 2025-09-09
 * @author: AnRui
 * @return: bool
 * @note  : 返回值 0: 读取setting失败
 *          返回值 1: 正常的启动模式
 *          返回值 2: 升级模式
 */
bool ReadSettingStartUpMode(uint8_t* mode);

/**
 * @desc  : APP升级
 * @date  : 2025-09-09
 * @author: AnRui
 * @return: UpgradeProcess_e
 * @note  : 将app数据从下载区复制到app区域
 */
UpgradeProcess_e  AppUpgrade(void);

/**
 * @desc  : 跳转到APP执行
 * @date  : 2025-09-09
 * @author: AnRui
 * @param : app_addr - {参数说明}:
 * @return: bool
 * @note  : 升级完成后 跳转到APP执行
 */
bool JumpAppRun(void);


/**
 * @desc  : 设置下一次bootloader的启动模式
 * @date  : 2025-09-09
 * @author: AnRui
 * @param : process - {参数说明}:
 * @note  :
 */
bool SetFlashSetting(StartUpMode_e BootLoaderStartMode);

#endif
